賀!此系列文榮獲 2023 iThome 鐵人賽《優選》獎項,正在規劃出書中,感謝大家的支持🙏,同名課程「Java 工程師必備!Spring Boot 零基礎入門」也已在 Hahow 平台上架
哈囉大家好,我是古古
在前幾篇文章中,我們已經了解了 Spring 框架中的 IoC 特性,那麼從這篇文章開始,我們就會接著來了解 Spring 框架中的另一個特性,也就是 AOP
AOP 的全稱是 Aspect-Oriented Programming,中文是翻譯成「切面導向程式設計」或是「剖面導向程式設計」,那我們一樣是可以透過一個例子,來介紹 AOP (切面導向程式設計) 到底是什麼
假設我們有一個 HpPrinter,並且在這個 HpPrinter 裡面只有一個 print()
方法,在 console 上印出傳進來的參數
如果我們想要去測量執行這個 print()
方法需要多長的時間,那我們可以在這個方法的最前面和最後面,去記錄當下的開始時間和結束時間,最後就可以去計算出 print()
方法總共執行了多久
雖然我們透過上面的寫法,是可以去測量 print()
方法的運作時間沒錯,但是大家如果觀察一下這段程式的話,就可以發現在這個 print()
方法裡面,充斥了許多跟「印東西」這個功能無關的程式
像是這個 print()
方法,他本來要做的事情,其實只是在 console 上面輸出「HP 印表機: ....」的這一行資訊而已,但是因為我們想要去測量時間,所以就加了很多不相關的程式進去,進而讓這個方法變得很複雜,不利於後續的程式維護
而且這樣子寫還會有一個衍生的問題,譬如說我們在 HpPrinter 裡面多新增了一個方法 printColor()
,然後我們也想要去測量這個 printColor()
方法的時間的話,那我們就得複製貼上所有測量時間的程式到 printColor()
方法裡面
現在只有這兩個方法要測量時間,所以這樣複製貼上可能覺得還好,但是如果當很多方法都需要測量執行時間的時候,這樣子的複製貼上就不會是一個好選項
所以為了解決這個問題,Spring AOP 就登場了!
我們可以來用一張圖來看一下,Spring AOP 是如何解決上面那個複製貼上的問題的
如果我們把剛剛的 HpPrinter 畫成圖的話,就會變成是下面這個樣子:
在上圖中呈現了 HpPrinter 中的 2 個方法:print()
和 printColor()
,每一個箭頭代表的是一個方法,而箭頭右邊的程式碼就是這個方法裡面所寫的程式
在這張圖也可以看到,在這兩個方法裡面,最一開始都會去記錄方法的開始時間,後面則是去記錄方法的結束時間,最後並且把結束時間和開始時間相減,去取得這個方法的執行時間
那這時候,Spring AOP 就提出一個想法了,既然這些測量時間的程式是每個方法都要使用的共同邏輯,那我們就把這些程式,去獨立出來成一個「切面」,由這個切面去橫貫所有的方法,替他們做測量時間的部分
所以當我們使用了 Spring AOP 之後,我們就不用在方法裡面加上任何測量時間的程式了!我們只要將測量時間的共同邏輯,統一的交給切面去做處理,這個切面會去橫貫所有的的方法,分別去測量每一個方法的執行時間,所以每個方法就只要專注在各自要做的事情就好,世界和平!!
而這樣子使用切面的寫法,就會稱作是 AOP,也就是 Aspect-Oriented Programming (切面導向程式設計)
透過上面這個例子了解 Spring AOP 的概念之後,我們可以回頭再看一下 AOP 的定義
AOP 的全稱是 Aspect-Oriented Programming,中文是翻譯為「切面導向程式設計」或是「剖面導向程式設計」,而 AOP 的概念,就是「透過切面,統一的去處理方法之間的共同邏輯」
因此當我們使用了 AOP 之後,就再也不用去複製貼上程式了,我們只只需要在切面裡面寫好測量時間的程式,之後就可以在任何地方去使用這個切面,讓這個切面替我們完成測量時間的功能,讚啦!
這篇文章先透過例子介紹了 Spring AOP 的原理,讓大家更好去理解 Spring AOP 的概念
那麼下一篇文章,就會來介紹要如何在 Spring Boot 中使用 Spring AOP 的功能,那我們就下一篇文章見啦!